package kgame5.k3d.core.camera {
import kgame5.k3d.core.math.Vector3D;
import kgame5.kmath.MathDG;
import kgame5.kmath.TriMath;

/**
 * @author kangkai
 * TODO 这个是有问题的，原因是0~360角度的时候转动时有问题的，这个可以靠四元数来做
 */
public class SpringCameraBee extends CameraBee{
	//________________________Static_______________________
	
	public static const K:Number=3;//移动到目标的时候的弹簧系数,这个可以改
		

	
	//--这个是为了弹簧效果用的
	private var curPan:int;
	private var curRadius:int;
	
	//_______________________Method__________________________
	public function SpringCameraBee(){
		super();
		
		//设置好初始位置
		
		this.place();
		
	}
	
	// 直接放置到目标,这个是为了设置好焦点和当前位置后，直接放置到目标
	public function place():void{
		curPan=pan;
		curRadius=radius;
		eyePosi.y=y;
		
		aimPosi.copy(target);
	}

	//判断CMT是否到了目的地
	public function isPosiOK():Boolean{
		return curRadius==radius&&curPan==pan&&eyePosi.y==y;
	}
	//判断焦点是否到了目标焦点
  	public function isFocusOK():Boolean{
  		return aimPosi.isEqual(target);
  	}
	
	override public function Update():void {
		
		//--焦点位置
		aimPosi.x=MathDG.Spring(aimPosi.x,this.target.x,K);
		aimPosi.y=MathDG.Spring(aimPosi.y,this.target.y,K);
		aimPosi.z=MathDG.Spring(aimPosi.z,this.target.z,K);
		
		//--摄象机位置
		pan=MathDG.C360(pan);
		curPan=MathDG.C360(curPan);
		
		curRadius=MathDG.Spring(curRadius,radius,K);
		curPan=MathDG.Spring(curPan,pan,K);
		
		eyePosi.x = aimPosi.x + curRadius*TriMath.sin(curPan);
		eyePosi.z = aimPosi.z + curRadius*TriMath.cos(curPan);
		
		eyePosi.y=MathDG.Spring(eyePosi.y,y,K);
		
		//--很关键的逻辑，计算是Mwc
		super.Update();
	}
}//end of class
}